package com.crm.system.service.opportunityManager;

import com.crm.common.model.DhPageInfo;
import com.crm.model.entity.contactManager.Contact;
import com.crm.model.entity.contactManager.ContactTag;
import com.crm.model.entity.opportunityManager.Opportunity;
import com.crm.model.entity.sys.UserAccount;
import com.crm.model.entity.sys.permissionManagement.SysCompany;
import com.crm.model.qo.contactManager.ContactQO;
import com.crm.model.qo.opportunityManager.AddOpportunityQO;
import com.crm.model.qo.opportunityManager.OpportunityQO;
import com.crm.model.qo.opportunityManager.OpportunityStatusQO;
import com.crm.model.vo.contactManager.ContactVO;
import com.crm.model.vo.customerManager.CustomerContactVO;
import com.crm.model.vo.datasearch.DataSearchResultVO;
import com.crm.model.vo.opportunityManager.*;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 商机管理信息
 */
public interface OpportunityService {

    /**
     * 商机管理 -- 商机列表
     * @param pageIndex
     * @param pageSize
     * @param opportunityQO
     * @param sortName
     * @param sortOrder
     * @return
     */
    DhPageInfo<OpportunityVO> selectOpportunityVoList(Integer pageIndex, Integer pageSize, OpportunityQO opportunityQO, String sortName, String sortOrder);

    /**
     * 商机管理-新增商机
     * @param addOpportunityQO 新增商机实体
     * @return
     */
    Boolean addOpportunity(AddOpportunityQO addOpportunityQO);

    /**
     * 商机管理-删除商机-修改商机删除标记
     * @param opportunityId
     * @return
     */
    Boolean updateOpportunity(String opportunityId);

    /**
     * 修改回显
     * @param opportunityId
     * @return
     */
    OpportunityCustomerVO getOpportunityId(String opportunityId);

    /**
     * 商机管理-修改商机
     * @param opportunity
     * @return
     */
    Boolean updateOpportunityId(Opportunity opportunity);

    /**
     * 根据联系人id查询商机
     * @param pageIndex 页码
     * @param pageSize 条数
     * @param sortName 分组字段
     * @param sortOrder 分组类型
     * @param contactId 联系人id
     * @return
     */
    DhPageInfo<OpportunityVO> opportunityDetailList(Integer pageIndex, Integer pageSize, String sortName, String sortOrder, String contactId);

    /**
     * 商机-商机详情-通过商机id查询
     * @param opportunityId 商机id
     * @return
     */
    OpportunityVO opportunityDetail(String opportunityId);

    /**
     * 根据客户id查询商机列表
     * @param customerId 客户id
     * @return
     */
    List<Opportunity> selectOpportunityListByCustomerId(String customerId);

    /**
     * 商机状态统计
     * @param opportunityStatusQO dateType thisMonth 本月 thisQuarter 本季度  thisYear 本年
     * @param opportunityStatusQO bs 0管理端 1用户端
     * @param opportunityStatusQO name 公司id
     * @param opportunityStatusQO startTime 开始时间
     * @param opportunityStatusQO endTime 结束时间
     * @return
     */
    List<Integer> oppStatusStatistics(OpportunityStatusQO opportunityStatusQO);

    /**
     * 商机产品比重
     * @param dateType thisMonth 本月 thisQuarter 本季度  thisYear 本年
     * @param bs 0管理端 1用户端
     * @return
     */
    List<OpportunityProductVO> oppProductStatistics(String dateType,String bs);

    /**
     * 管理模块 --商机分布--商机列表
     * @param pageIndex 页码
     * @param pageSize 分页大小
     * @param sortName 排序列名字
     * @param sortOrder 排序规则(asc/desc)
     * @param dateType thisMonth 本月 thisQuarter 本季度  thisYear 本年
     * @param bs 0管理端 1用户端
     * @return
     */
    DhPageInfo<OpportunityStatisticsVO> selectOppStatistics(Integer pageIndex, Integer pageSize, String sortName, String sortOrder, String dateType, String bs);

    /**
     * 通过商机id带出来合同需要的数据
     * @param opportunityId 商机id
     * @return
     */
    OpportunityContractDetailVO opportunityContractDetail(String opportunityId);

    /**
     * 管理员-商机状态统计
     * @param opportunityStatusQO dateType thisLastMonth 上月  thisMonth 本月 thisQuarter 本季度  thisYear 本年  section 区间
     * @param opportunityStatusQO startTime 起始时间
     * @param opportunityStatusQO endTime 截止时间
     * @return
     */
    Map<String,Object> adminOppStatusStatistics(OpportunityStatusQO opportunityStatusQO);

    /**
     * 管理员-业绩排名
     * @param opportunityStatusQO dateType thisLastMonth 上月  thisMonth 本月 thisQuarter 本季度  thisYear 本年  section 区间
     * @param opportunityStatusQO startTime 起始时间
     * @param opportunityStatusQO endTime 截止时间
     * @return
     */
    List<PerformanceRankingVO> performanceRanking(OpportunityStatusQO opportunityStatusQO);

    /**
     * 统计商机数据一览
     * @return
     */
    Map<String, OpportunityDataVO> oppDataStatistics();

    /**
     * 商机合同占比
     * @param dateType //thisLastMonth 上月 thisWeek 本周  thisMonth 本月
     * @param bs 0 商机合同占比  1商机合同类型比例 2商机成交额比例
     * @return
     */
    List<OpportunityProductVO> oppContractProportion(String dateType,String bs);

    /**
     * 商机拥有数排行
     * @param bs 1赢单排行  2总数排行
     * @return
     */
    List<OpportunityOfNumberVO> oppOfNumber(Integer bs);

    /**
     * 商机状态个数跟进占比意向占比
     * @param dateType thisLastMonth 上月 thisWeek 本周  thisMonth 本月
     * @return
     */
    List<OpportunityFollowIntentionZbVO> opportunityFollowIntentionZb(String dateType);

    /**
     * 个人业绩下的商机分析数量
     * @param opportunityStatusQO 用户id
     * @return
     */
    List<Integer> oppStatusStatisticsAdmin(OpportunityStatusQO opportunityStatusQO);


    /**
     * @Description: 根据商机名称查询数据
     * @Param: [opportunityName]
     * @Return: java.util.List<com.crm.model.vo.datasearch.DataSearchResultVO>
     * @Author: lixq-f
     * @Date: 2021/5/13
     **/
    List<DataSearchResultVO> selectDataByOpportunityName(String opportunityName);

}
